package test;

import java.util.ArrayList;
import java.util.List;

/**
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行Z 字形排列。
 * <p>
 * 比如输入字符串为 "PAYPALISHIRING"行数为 3 时，排列如下：
 * <p>
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 * <p>
 * 请你实现这个将字符串进行指定行数变换的函数：
 * <p>
 * string convert(string s, int numRows);
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "PAYPALISHIRING", numRows = 3
 * 输出："PAHNAPLSIIGYIR"
 * 示例 2：
 * 输入：s = "PAYPALISHIRING", numRows = 4
 * 输出："PINALSIGYAHRPI"
 * 解释：
 * P     I    N
 * A   L S  I G
 * Y A   H R
 * P     I
 * 示例 3：
 * <p>
 * 输入：s = "A", numRows = 1
 * 输出："A"
 */
public class test20210405 {
    public static void main(String[] args) {
        String testMessage = "XINGJIABAO";
        int rowNum = 4;
        String result = solution(testMessage,rowNum);
        System.out.println(result);
    }
    public static String solution(String testMessage,int rowNum){
        //如果行数为1，直接输出
        if(rowNum ==1)    return testMessage;
        //List为列，stringbuilder为行
        List<StringBuilder> list = new ArrayList<StringBuilder>();
        //确定行数
        for (int i = 0; i < Math.min(rowNum, testMessage.length()); i++)
            list.add(new StringBuilder());
        //num 循环的行数
        int num = 0;
        //goingDown 方向
        boolean goingDown = false;
        for(char c :testMessage.toCharArray()){
            list.get(num).append(c);
            if(num==0||num == rowNum-1) {goingDown = !goingDown;}
            num+=goingDown?1:-1;
        }
        StringBuilder ret = new StringBuilder();
        for (StringBuilder row : list) ret.append(row);
        return ret.toString();
    }
}


